// EAN.js - EAN 条码基类（适用于 EAN-8、EAN-13）
// Vite + ES Module 兼容格式

import Barcode from '../Barcode.js';
import { SIDE_BIN, MIDDLE_BIN } from './constants.js';
import encoder from './encoder.js';
export default class EAN extends Barcode {
	constructor(data, options) {
		super(data, options);

		// 防止字体过大（超过条码宽度）
		this.fontSize =
			!options.flat && options.fontSize > options.width * 10
				? options.width * 10
				: options.fontSize;

		// 守卫条（guard bars）高度：主条码高度 + 字体一半 + 文字边距
		this.guardHeight =
			options.height + this.fontSize / 2 + (options.textMargin || 2);
	}

	/**
	 * 编码入口：根据 flat 模式选择输出格式
	 */
	encode() {
		return this.options.flat ? this.encodeFlat() : this.encodeGuarded();
	}

	/**
	 * 获取左侧文本（用于显示）
	 * @param {number} from - 起始位置
	 * @param {number} to - 结束位置（长度）
	 * @returns {string}
	 */
	leftText(from, to) {
		return this.text.substr(from, to);
	}

	/**
	 * 编码左侧数据（使用 encoder 处理结构）
	 * @param {string} data - 数据
	 * @param {string} structure - 编码结构（如 'LLGGLG'）
	 * @returns {string} 二进制条码
	 */
	leftEncode(data, structure) {
		return encoder(data, structure);
	}

	/**
	 * 获取右侧文本
	 * @param {number} from
	 * @param {number} to
	 * @returns {string}
	 */
	rightText(from, to) {
		return this.text.substr(from, to);
	}

	/**
	 * 编码右侧数据（通常使用 R 编码）
	 * @param {string} data
	 * @param {string} structure
	 * @returns {string}
	 */
	rightEncode(data, structure) {
		return encoder(data, structure);
	}

	/**
	 * 标准编码模式（带守卫条和文本分段）
	 * 返回条码段数组，用于渲染图形条码
	 * @returns {Array<{ data: string, text?: string, options: object }>}
	 */
	encodeGuarded() {
		const textOptions = { fontSize: this.fontSize };
		const guardOptions = { height: this.guardHeight };

		return [
			// 左侧守卫条
			{ data: SIDE_BIN, options: guardOptions },
			// 左侧编码 + 文本
			{ data: this.leftEncode(), text: this.leftText(), options: textOptions },
			// 中间分隔条
			{ data: MIDDLE_BIN, options: guardOptions },
			// 右侧编码 + 文本
			{
				data: this.rightEncode(),
				text: this.rightText(),
				options: textOptions,
			},
			// 右侧守卫条
			{ data: SIDE_BIN, options: guardOptions },
		];
	}

	/**
	 * 扁平化编码模式（不区分段落，仅返回完整二进制字符串）
	 * 适用于简单渲染或自定义绘制
	 * @returns {{ data: string, text: string }}
	 */
	encodeFlat() {
		const data = [
			SIDE_BIN,
			this.leftEncode(),
			MIDDLE_BIN,
			this.rightEncode(),
			SIDE_BIN,
		].join('');

		return {
			data,
			text: this.text,
		};
	}
}
